package com.zhilianbao.leyaogo.ui.fragment.me;

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;

import com.bql.utils.CheckUtils;
import com.zhilianbao.leyaogo.R;
import com.zhilianbao.leyaogo.http.api.AccountApi;
import com.zhilianbao.leyaogo.http.callback.JsonCallback;
import com.zhilianbao.leyaogo.model.response.me.HelpResponse;
import com.zhilianbao.leyaogo.model.response.me.UserDetailsInfo;
import com.zhilianbao.leyaogo.ui.adapter.me.ServiceHelpAdapter;
import com.zhilianbao.leyaogo.ui.fragment.base.BaseOkHttpFragment;
import com.zhilianbao.leyaogo.utils.Utils;
import com.zhilianbao.leyaogo.utils.XToastUtils;
import com.zhilianbao.leyaogo.view.dialog.LeProgressDialog;

import java.util.List;

import butterknife.BindView;
import butterknife.OnClick;
import io.rong.imkit.RongIM;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.CSCustomServiceInfo;
import io.rong.imlib.model.UserInfo;
import okhttp3.Call;
import okhttp3.Response;

/**
 * Created by liu on 2016/10/27.
 * 客服与帮助
 */
public class ServiceHelpFragment extends BaseOkHttpFragment {
    private static final int WHAT_SUCCESS = 100 * 100;  //连接融云成功
    private static final int WHAT_CONNECTING = 100 * 200;   //连接融云中
    private static final int WHAT_NETWORK_UNAVAILABLE = 100 * 300;  //网络不可用
    @BindView(R.id.ser_help_listView)
    ExpandableListView serHelpListView;
    @BindView(R.id.tv_contact_server)
    TextView mTvContactServer;

    private int lastPosition = -1;// 代表之前打开的条目的ID
    ImageView iv;
    private ServiceHelpAdapter mServiceHelpAdapter;

    private LeProgressDialog mDialog;
    private UserDetailsInfo mUserDetailsInfo;

    public static ServiceHelpFragment getInstance() {
        ServiceHelpFragment fragment = new ServiceHelpFragment();
        return fragment;
    }


    @Override
    protected void initToolbarHere() {
        initToolbar(getString(R.string.ser_help));
    }


    @Override
    protected void initViewsAndEvents(Bundle savedInstanceState) {
        loadData();
        initAdapter();

    }

    private void initAdapter() {
        //设置ExpandableListView的适配器
        serHelpListView.setVerticalScrollBarEnabled(false);//去掉右侧的滚动条
//        //将ExpandableListView的箭头位置变换到右侧（包括继承自ExpandableListView的文件）
//        Display newDisplay = getActivity().getWindowManager().getDefaultDisplay();
//        int width = newDisplay.getWidth();
//        serHelpListView.setIndicatorBounds(width - 100, width);
        //设置 属性 GroupIndicator 去掉默认向下的箭头
        serHelpListView.setGroupIndicator(null);
        //讲ExpandableListView的条目间距设为0
        serHelpListView.setDividerHeight(0);
        //设置一级条目的点击事件
        serHelpListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                                        int groupPosition, long id) {
                // 全部被合上, 点击一个就打开一个
                if (lastPosition == -1) {
                    // 展开一个一级菜单
                    serHelpListView.expandGroup(groupPosition);
                    lastPosition = groupPosition;

                } else {
                    // 开了一个, 如果点自己,把自己合上
                    if (lastPosition == groupPosition) {
                        serHelpListView.collapseGroup(groupPosition);
                        lastPosition = -1;
                        iv = null;
                    } else {
                        // 开了一个, 点别人, 把自己合上,打开别人
                        serHelpListView.collapseGroup(lastPosition);
                        serHelpListView.expandGroup(groupPosition);
                        lastPosition = groupPosition;
                    }
                }
                return true;
            }
        });
    }

    private void loadData() {
        AccountApi.getCustomerHelp(mActivity, Utils.getSupplierId(), new JsonCallback<List<HelpResponse>>(mActivity) {
            @Override
            public void onSuccess(List<HelpResponse> helpResponses, Call call, Response response) {
                mServiceHelpAdapter = new ServiceHelpAdapter(mActivity, helpResponses);
                serHelpListView.setAdapter(mServiceHelpAdapter);
            }
        });
    }

    @Override
    protected int getContentViewLayoutID() {
        return R.layout.fragment_ser_help;
    }

    @OnClick({R.id.tv_contact_server})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv_contact_server:
                boolean isUserLogin = Utils.justIsUserLogin();
                mUserDetailsInfo = Utils.getUserInfo();
                if (isUserLogin) {
                    if (mUserDetailsInfo == null) {
                        XToastUtils.showShortToast("获取用户信息失败,请重新登录");
                        Utils.gotoLogin();
                    } else {
                        mDialog = new LeProgressDialog(getActivity());
                        //连接状态监听
                        connectState();
//                        Utils.startActivity(mActivity, ContactServerActivity.class);
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                //耗时操作放在子线程,防止按钮点击阻塞
                                startRongyunKefu();
                            }
                        }).start();
                    }
                } else {
                    Utils.gotoLogin();
                }
                break;
        }
    }


    private void connectState() {
        /**
         * 设置连接状态变化的监听器。
         *
         * @param listener 连接状态变化的监听器。
         */
        RongIM.setConnectionStatusListener(new RongIMClient.ConnectionStatusListener() {
            @Override
            public void onChanged(ConnectionStatus connectionStatus) {
                switch (connectionStatus) {

                    case CONNECTED://连接成功。
                        mHandler.sendEmptyMessage(WHAT_SUCCESS);
                        break;
                    case DISCONNECTED://断开连接。

                        break;
                    case CONNECTING://连接中。
                        mHandler.sendEmptyMessage(WHAT_CONNECTING);
                        break;
                    case NETWORK_UNAVAILABLE://网络不可用。
                        mHandler.sendEmptyMessage(WHAT_NETWORK_UNAVAILABLE);
                        break;
                    case KICKED_OFFLINE_BY_OTHER_CLIENT://用户账户在其他设备登录，本机会被踢掉线

                        break;
                }
            }
        });
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case WHAT_CONNECTING://连接融云中
                    if (mDialog != null) {
                        mDialog.show();
                    }
                    break;
                case WHAT_SUCCESS://连接融云成功
                    if (mDialog != null && mDialog.isShowing()) {
                        mDialog.dismiss();
                    }
                    break;
                case WHAT_NETWORK_UNAVAILABLE: //网络连接不可用
                    if (mDialog != null && mDialog.isShowing()) {
                        mDialog.dismiss();
                    }
                    XToastUtils.showShortToast("网络连接不可用");
                    break;
            }
        }
    };


    String portraitUri = "";
    private String mUserName;
    private String mNickName;
    private String mUserPic;

    private void startRongyunKefu() {
        //获取保存信息
        String rongyunToken = Utils.getRongyunToken();
        initNickName();
        initPic();

        //融云token
        if (CheckUtils.isEmpty(rongyunToken)) {
            getSeverToken();
        } else {
            connect(rongyunToken);
        }
        setUserInfo();
    }

    //初始化头像
    private void initPic() {
        mUserPic = Utils.returnUrlShow(mUserDetailsInfo.getUserPic());
        if (CheckUtils.isEmpty(mUserPic)) {
            mUserPic = "http://";
        }
    }

    //初始化昵称
    private void initNickName() {
        mNickName = mUserDetailsInfo.getNickName();
        if (CheckUtils.isEmpty(mNickName)) {
            mNickName = "";
        }
    }

    //启动客服
    private void startCustomer() {
        //首先需要构造使用客服者的用户信息
        CSCustomServiceInfo.Builder csBuilder = new CSCustomServiceInfo.Builder();
        CSCustomServiceInfo csInfo = csBuilder.nickName(mNickName).build();

        /**
         * 启动客户服聊天界面。
         *
         * @param context           应用上下文。
         * @param customerServiceId 要与之聊天的客服 Id。
         * @param title             聊天的标题，如果传入空值，则默认显示与之聊天的客服名称。
         * @param customServiceInfo 当前使用客服者的用户信息。{@link CSCustomServiceInfo}
         */
        String rongyunId = Utils.getRongyunId();//获取融云客服id
        if (CheckUtils.isEmpty(rongyunId)) {
            XToastUtils.showShortToast("您好未选择运营商,请选择运营商");
            return;
        }
//        String id = "KEFU148471998719808";      //开发环境的客服ID
//        String id = "KEFU148489197131875";    //生产环境的客服ID
        RongIM.getInstance().startCustomerServiceChat(mActivity, rongyunId, "", csInfo);
//        /**
//         * 启动单聊
//         * context - 应用上下文。
//         * targetUserId - 要与之聊天的用户 Id。
//         * title - 聊天的标题，如果传入空值，则默认显示与之聊天的用户名称。
//         */
//        if (RongIM.getInstance() != null) {
//            RongIM.getInstance().startPrivateChat(ContactServerActivity.this, "aa", "");
//        }

    }

    private void setUserInfo() {
        /**
         * 设置用户信息的提供者，供 RongIM 调用获取用户名称和头像信息。
         *
         * @param userInfoProvider 用户信息提供者。
         * @param isCacheUserInfo  设置是否由 IMKit 来缓存用户信息。<br>
         *                         如果 App 提供的 UserInfoProvider
         *                         每次都需要通过网络请求用户数据，而不是将用户数据缓存到本地内存，会影响用户信息的加载速度；<br>
         *                         此时最好将本参数设置为 true，由 IMKit 将用户信息缓存到本地内存中。
         * @see UserInfoProvider
         */
        RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {

            @Override
            public UserInfo getUserInfo(String userId) {
                UserInfo userInfo = new UserInfo(String.valueOf(mUserDetailsInfo.getUserId()), mUserDetailsInfo.getNickName(), Uri.parse(mUserPic));
                return userInfo;//根据 userId 去你的用户系统里查询对应的用户信息返回给融云 SDK。
            }

        }, true);
    }

    //获取服务器的token
    private void getSeverToken() {
        long userId = mUserDetailsInfo.getUserId();
        if (CheckUtils.isEmpty(mUserDetailsInfo.getNickName())) {
            mUserName = mUserDetailsInfo.getUserMobile();
        } else {
            mUserName = mUserDetailsInfo.getNickName();
        }
        if (mUserDetailsInfo.getUserPic() != null) {
            portraitUri = mUserDetailsInfo.getUserPic();
        }
        AccountApi.getCustomerToken(mActivity, userId, mUserName, portraitUri, new JsonCallback<String>(mActivity) {

            @Override
            public void onSuccess(String s, Call call, Response response) {
                Utils.putRongyunToken(s);
                connect(s);
            }
        });
    }

    /**
     * <p>连接服务器，在整个应用程序全局，只需要调用一次，需在 之后调用。</p>
     * <p>如果调用此接口遇到连接失败，SDK 会自动启动重连机制进行最多10次重连，分别是1, 2, 4, 8, 16, 32, 64, 128, 256, 512秒后。
     * 在这之后如果仍没有连接成功，还会在当检测到设备网络状态变化时再次进行重连。</p>
     *
     * @param token 从服务端获取的用户身份令牌（Token）。
     * @return RongIM  客户端核心类的实例。
     */
    private void connect(String token) {
//        if (getApplicationInfo().packageName.equals(LeYaoGoApplication.getProcessName(android.os.Process.myPid()))) {

        RongIM.connect(token, new RongIMClient.ConnectCallback() {

            /**
             * Token 错误。可以从下面两点检查 1.  Token 是否过期，如果过期您需要向 App Server 重新请求一个新的 Token
             *                  2.  token 对应的 appKey 和工程里设置的 appKey 是否一致
             */
            @Override
            public void onTokenIncorrect() {
                getSeverToken();
            }

            /**
             * 连接融云成功
             * @param userId 当前 token 对应的用户 id
             */
            @Override
            public void onSuccess(String userId) {
                startCustomer();
                //连接融云成功刷新用户信息
                refreshUserData();
            }

            /**
             * 连接融云失败
             * @param errorCode 错误码，可到官网 查看错误码对应的注释
             */
            @Override
            public void onError(RongIMClient.ErrorCode errorCode) {

            }
        });
//        }
    }

    private void refreshUserData() {
        /**
         * 刷新用户缓存数据。
         *
         * @param userInfo 需要更新的用户缓存数据。
         */

        RongIM.getInstance().refreshUserInfoCache(new UserInfo(String.valueOf(mUserDetailsInfo.getUserId()), mNickName, Uri.parse(mUserPic)));
    }

    @Override
    public void onDestroy() {
        if (mDialog != null) {
            mDialog.dismiss();
            mDialog = null;
        }
        super.onDestroy();
    }
}
